package middleware

import (
	"server/utils"
	"strings"

	"github.com/gin-gonic/gin"
)

func JwtAuthHandler() func(c *gin.Context) {
	return func(c *gin.Context) {

		// 白名单处理
		passUrl := []string{
			"/api/admin/login",
			"/api/admin/verifi_code",
			"/api/demo",
			"/swagger",
		}
		isPass := false
		for i := 0; i < len(passUrl); i++ {
			if strings.Contains(c.Request.URL.String(), passUrl[i]) {
				isPass = true
			}
		}
		if isPass {
			c.Next()
			return
		}
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// 这里的具体实现方式要依据你的实际业务情况决定
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			c.JSON(
				200,
				utils.DealResponse(utils.Response{
					"code": 5001,
					"msg":  "token无效",
				}),
			)
			c.Abort()
			return
		}
		// 按空格分割
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			c.JSON(
				200,
				utils.DealResponse(utils.Response{
					"code": 5001,
					"msg":  "token无效",
				}),
			)
			c.Abort()
			return
		}
		// parts[1]是获取到的tokenString，我们使用之前定义好的解析JWT的函数来解析它
		mc, err := utils.ParseToken(parts[1])
		if err != nil {
			c.JSON(
				200,
				utils.DealResponse(utils.Response{
					"code": 5001,
					"msg":  "token无效",
				}),
			)
			c.Abort()
			return
		}
		// 将当前请求的信息保存到请求的上下文c上
		c.Set("phone", mc.Phone)
		c.Next() // 后续的处理函数可以用过c.Get("phone")来获取当前请求的用户信息
	}
}
